package com.kexilo.core.common.service;

import com.kexilo.core.audit.domain.SysOperLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * 简单的操作日志服务
 * 直接处理日志保存，无需复杂的Event系统
 * 
 * @author Kexilo
 */
@Service
public class OperationLogService {
    
    private static final Logger log = LoggerFactory.getLogger(OperationLogService.class);
    
    /**
     * 异步保存操作日志到数据库
     * 简化架构：直接调用，无需Event系统
     * 
     * @param operLog 操作日志对象
     */
    @Async
    public void saveOperationLog(SysOperLog operLog) {
        try {
            // TODO: 这里应该注入实际的Mapper来保存到数据库
            // 目前先记录到日志文件，待后续集成具体的数据库操作
            
            log.info("保存操作日志到数据库: title={}, businessType={}, operName={}, operUrl={}, operIp={}, operLocation={}, operParam={}, jsonResult={}, status={}", 
                    operLog.getTitle(), 
                    operLog.getBusinessType(), 
                    operLog.getOperName(),
                    operLog.getOperUrl(), 
                    operLog.getOperIp(), 
                    operLog.getOperLocation(),
                    operLog.getOperParam(), 
                    operLog.getJsonResult(),
                    operLog.getStatus());
                    
            // 实际的数据库操作示例：
            // sysOperLogMapper.insertOperlog(operLog);
            
        } catch (Exception e) {
            log.error("保存操作日志失败: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 异步保存登录日志到数据库
     * 
     * @param username 用户名
     * @param status 登录状态
     * @param ipAddr IP地址
     * @param location 登录地点
     * @param browser 浏览器
     * @param os 操作系统
     * @param message 消息
     */
    @Async
    public void saveLoginLog(String username, String status, String ipAddr, String location, String browser, String os, String message) {
        try {
            // 构建登录日志对象
            SysOperLog loginLog = new SysOperLog();
            loginLog.setTitle("用户登录");
            loginLog.setBusinessType("LOGIN".equals(status) ? 0 : 1); // 0-成功, 1-失败
            loginLog.setOperName(username);
            loginLog.setOperIp(ipAddr);
            loginLog.setOperLocation(location);
            loginLog.setOperParam(String.format("browser=%s, os=%s", browser, os));
            loginLog.setStatus("LOGIN".equals(status) ? 0 : 1);
            loginLog.setErrorMsg("FAIL".equals(status) ? message : null);
            
            // 保存登录日志
            saveOperationLog(loginLog);
            
        } catch (Exception e) {
            log.error("保存登录日志失败: username={}, error={}", username, e.getMessage(), e);
        }
    }
}
